Micron Document
██████╗ ███████╗████████╗██╗██████╗ ███████╗██████╗ ██╗ █████╗
██╔══██╗██╔════╝╚══██╔══╝██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗
██████╔╝█████╗ ██║ ██║██████╔╝█████╗ ██║ ██║██║███████║
██╔══██╗██╔══╝ ██║ ██║██╔═══╝ ██╔══╝ ██║ ██║██║██╔══██║
██║ ██║███████╗ ██║ ██║██║ ███████╗██████╔╝██║██║ ██║
╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚══════╝╚═════╝ ╚═╝╚═╝ ╚═╝


🬧 The NomadNet Encyclopedia | Archives | Info
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b

🔍 Search

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

OpenMP
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
mwbqOpenMP (Open Multiprocessing) è un mwbgAPI multipiattaforma per la creazione di applicazioni parallele su sistemi a memoria condivisa. È supportata da vari linguaggi di programmazione come il mwbwC/mwcaC++ e il mwcqFortran e su varie mwcgarchitetture di elaboratori e mwcwsistemi operativi tra cui mwdaSolaris, mwdqAIX, mwdgHP-UX, mwdwLinux, mweamacOS e la piattaforma mweqWindows. OpenMP è composto da un insieme di mwegdirettive di compilazione, mwewroutine di librerie e variabili d'ambiente che ne definiscono il funzionamento a run-time.cite-ref-openmp-org-1-0[1]cite-ref-2[2]cite-ref-3[3]

mwiqOpenMP è gestito dal consorzio mwigno profit mwiwOpenMP Architecture Review Board (or OpenMP ARB) assieme ad un gruppo di produttori di Hardware e di sviluppatori di software come mwjaAMD, mwjqIBM, mwjgIntel, mwjwCray Inc., mwkaHewlett-Packard, mwkqFujitsu, mwkgNVIDIA Corporation, mwkwNEC Corporation, mwlaMicrosoft Corporation, mwlqTexas Instruments, mwlgOracle ed altri.

mwmaOpenMP usa un modello scalabile e portabile che fornisce al mwmqprogrammatore un'interfaccia semplice e flessibile per sviluppare applicazioni di calcolo parallele che possono essere eseguite da uno standard mwmgComputer desktop fino ai mwmwSupercomputercite-ref-4[4].

Un'applicazione sviluppata con il modello ibrido di mwoqprogrammazione parallela può essere eseguita su un mwogComputer cluster utilizzando OpenMP e mwowMessage Passing Interface (MPI) oppure in modo trasparente utilizzando le estensioni OpenMP per i sistemi con memoria non condivisa.

Contents

Storia
Note

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Introduzione

mwpwOpenMP è un'implementazione del concetto di mwqamultithreading ovvero di un metodo di parallelizzazione per cui un mwqqmaster thread (una serie di istruzioni eseguite consecutivamente) crea un certo numero di mwqgslave thread e un task (processo) è diviso tra i vari mwqwslave thread. I thread vengono eseguiti in modo concorrente mentre il mwrarun-time system alloca i thread su processori disponibili.

La sezione di codice che si intende eseguire in parallelo viene marcata attraverso una apposita mwrgdirettiva che causa la creazione dei thread prima della esecuzione. Ogni thread è identificato tramite un id che può essere ottenuto tramite la funzione mwrwomp_get_thread_num(). Tale valore è di tipo intero e per il master thread vale 0. Al termine della esecuzione del codice parallelizzato gli slave thread ritornano il controllo al master thread il quale continua l'esecuzione fino al termine del programma.

Per default ogni thread esegue la sezione parallelizzata (mwsqparallelized section) di codice in modo indipendente. Appositi costrutti per la divisione del lavoro (chiamati mwsgWork-sharing constructs) permettono di dividere il task tra i thread disponibili in modo che ciascuno di essi esegua la propria parte di codice. Il mwswparallelismo a livello di thread e quello a livello di dati sono ottenuti attraverso l'OpenMP in questo modo.

L'ambiente di esecuzione in tempo reale (mwtqruntime environment) alloca i thread sui processori a seconda di vari fattori tra cui il carico della macchina. Nel mwtglinguaggio C/mwtwC++ le funzioni implementate dallo standard OpenMP sono incluse in un mwuafile header chiamato mwuqomp.h.

Storia

L'mwvaOpenMP Architecture Review Board (ARB) pubblicò le prime specifiche per queste API allora chiamate mwvqOpenMP for Fortran 1.0 nell'ottobre mwvg1997. Sempre nell'ottobre dell'anno successivo furono poi rese disponibili per il linguaggio C/C++. Nell'anno mwvw2000 uscirono le specifiche versione 2.0 per il linguaggio Fortran mentre nel mwwa2002 furono rilasciate per il C/C++. Nel mwwq2005 escono poi le specifiche 2.5 (per entrambi i linguaggi C/C++ e Fortran) e nel maggio mwwg2008 quelle 3.0. Il 9 luglio mwww2011 sono state rilasciate le specifiche 3.1. Attualmente le specifiche più recenti sono la versione 4.0 pubblicata nel luglio mwxa2013.

Gli elementi fondamentali

Elementi fondamentali di OpenMP sono i costrutti per la creazione dei thread, per la distribuzione dei carichi di lavoro (mwywwork sharing), il data-environment management, la sincronizzazione dei thread, le routine mwzaRun-time a livello utente e le variabili d'ambiente. Nel linguaggio C/C++ viene utilizzata la direttiva mwzqmwzg#pragma.

• mwaqCreazione dei thread

La direttiva mwawmwba#pragma omp parallel è usata per la creazione dei thread addizionali. Il thread originale è chiamato mwbqmaster thread e ha come identificativo l'ID 0.

Esempio (in C): Visualizzare la stringa "Hello, world" utilizzando thread multipli.

#include <stdio.h>
int main(void)
{
#pragma omp parallel
printf("Hello, world.\n");
return 0;
}

Viene usato il flag mwja-fopenmp per compilare utilizzando il compilatore mwjqGCC:

$gcc -fopenmp hello.c -o hello

L'Output su un computer con 2 Core e 2 threads è il seguente:

Hello, world.
Hello, world.

L'output può essere non comprensibile a causa del fenomeno di mwnqRace condition dovuto ai due thread che condividono lo mwngstandard output.

Hello, wHello, woorld.
rld.

• mwpgCostrutti di Work sharing

Sono usati per assegnare compiti indipendenti a uno o a tutti i thread.

• mwraomp for o mwrqomp do: divide il ciclo di loop sui threads. È chiamato anche mwrgloop construct.
• mwsasections: assegna un blocco di codice consecutivo ma indipendente a differenti thread.
• mwsgsingle: assegna un blocco di codice che sarà eseguito da un solo thread.
• mwtamaster: simile alla modalità mwtqsingle, ma il blocco di codice sarà eseguito dal solo master thread.

Esempio: inizializzare il valore in un array in parallelo utilizzando ogni thread per svolgere il lavoro

int main(int argc, char *argv[]) {
const int N = 100000;
int i, a[N];
#pragma omp parallel for
for (i = 0; i < N; i++)
a[i] = 2 * i;
return 0;
}

• mwaqwClausole OpenMP (data environment management)

Essendo OpenMP un modello di programmazione per sistemi di tipo mwaq4shared memory, la maggior parte delle variabili sono visibili, per default, a tutti i thread. A volte, invece, sono necessarie delle variabili private per evitare fenomeni di mwaq8Race Conditions oppure c'è l'esigenza di passare dei valori tra la parte sequenziale del programma e la parte parallela. Per questo motivo l'mwaraenvironment management definisce degli attributi di condivisione.

Note

cite-note-openmp-org-11. mwarchttp://openmp.org/wp/openmp-compilers/ OpenMP Compilers
cite-note-22. mwarshttp://openmp.org/wp/2008/10/openmp-tutorial-at-supercomputing-2008/ OpenMP Tutorial at Supercomputing 2008
cite-note-33. mwar8http://openmp.org/wp/2009/04/download-book-examples-and-discuss/ Using OpenMP - Portable Shared Memory Parallel Programming - Download Book Examples and Discuss
cite-note-44. mwasmhttp://openmp.org/wp/2008/11/openmp-30-status/ OpenMP 3.0 Status

Altri progetti

Altri progetti

• Wikimedia Commons

• Wikimedia Commons contiene immagini o altri file su OpenMP

Collegamenti esterni

• (EN) Sito ufficiale, su openmp.org.
• mwasoGOMP is mwassGCC's OpenMP implementation, part of GCC
• mwas0IBM Octopiler mwas4Archiviato il 29 gennaio 2009 in Internet Archive. with OpenMP support
• mwateBlaise Barney, Lawrence Livermore National Laboratory site on OpenMP, su computing.llnl.gov. URL consultato il 6 dicembre 2012 (archiviato dall'url originale il 18 dicembre 2019).
• mwatmompca, an application in REDLIB project for the interactive symbolic model-checker of C/C++ programs with OpenMP directives, su sourceforge.net.